Conversation
Replace the hardcoded, stale commit-scope list in CLAUDE.md section 3.3 with a pointer to the README Repo layout section, and finish the public-phase wording: drop the internal-AI-stats framing and the GitLab-era JIRA / merge-request residue from the trailer rules, the PR-open flow, and the PR template. Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…e_and_template_cleanup docs: point commit-scope at README and finish public-phase cleanup
…adius Prompt injection can't be fully prevented, so this hardens defense-in-depth: label untrusted content with a tamper-resistant boundary the model is told to treat as data, and shrink the blast radius of a successful injection. Scope follows the analysis report — high-value, low-complexity items; deeper items (sandbox default flip, capability tokens, MCP/skill signing, memory audit log) are deliberately deferred. - security/trust.py: wrap_untrusted() fences external content with a per-call random nonce, so embedded fake close-markers can't escape the fence. - system prompt: a guideline telling the model to treat fenced/external content as data, watch for "ignore the above" / "you are now" style directives, and confirm high-impact actions via ask_user. - fence untrusted tool output at the single chokepoint (ContextBuilder.add_tool_result) and inside the subagent's own loop, plus the subagent result re-injected into the main agent. - fence recalled memory and the sentinel's memory/attention context as unverified; the planner is told unverified content must not drive privileged actions (spawn / nudge). - web_fetch: use security.network.validate_url_target (DNS-resolving SSRF check) instead of the previous scheme-only validator. - DirectExecutor: pass only an env allowlist (no host secrets) rather than the full host environment; warn loudly when running unsandboxed (backend=none). - subagents: per-session rolling-hour spawn rate limit (auto-recovering) to stop a prompt-injected re-injection loop without locking out legitimate use. Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…-turns switch Wire the TUI /model command end to end: model.* RPC handlers (options / save_key / disconnect / add_model / remove_model); a config.set "model" branch that rebuilds the live provider and reassigns the agent loop so a switch takes effect on the next turn (guarded by is_turn_active); ProviderConfig.models for the manual picker catalogue; the custom provider routed through LiteLLM; and a base LLMProvider.chat_stream non-streaming fallback so non-litellm providers degrade gracefully instead of crashing. Frontend: the model picker gains an api_base input, inline model add/delete, and a structured switch through config.set; openrpc-derived types regenerated. Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
feat: add TUI /model — provider/model config CRUD and between-turns model switch
…ning_untrusted_content feat(security): label untrusted content and contain injection blast radius
Two related changes to the EverOS-backed memory subsystem. Migrated three recall improvements from the legacy everclaw repo (env vars renamed EVERCLAW_* -> RAVEN_*): - drop current-session hits from the # Memory recall so it does not duplicate the live conversation already in the history window (over-fetch top_k*2, then filter by session_id) - add `raven agent --message-file` for prompts beyond the shell ARG_MAX - env-gated episodic recall + preference annotation in the consolidator (RAVEN_EPISODIC_TOPK / RAVEN_ANNOTATE_PREFS / RAVEN_EPISODIC_CLUSTER), default-off Restructured when EverOS is invoked so native memory owns short-term and EverOS owns long-term: - recall is now on-miss: native runs every turn; EverOS user-track recall fires only when native surfaces nothing relevant to the query - the per-turn EverOS store is removed; EverOS consolidation runs only (a) intra-day when a session crosses everos_consolidation_threshold_pct of the context window (default 80, background, non-blocking) and (b) nightly at everos_nightly_consolidation_hour (default 0, offline) - backend.store gains force_flush to promote a batch immediately; consolidation is incremental per session (metadata watermark) so the two triggers never double-ingest - native short-term compaction (maybe_consolidate_by_tokens) is unchanged Tests: unit coverage for the threshold / nightly / on-miss paths plus a full in-memory lifecycle smoke, and a real-everos e2e for the force_flush single-store recall path. Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
EverOS defaulted both its user-level config toml and its data root (sqlite / lancedb / .index / ome.db) to a bare ~/.everos. Scope raven's instance under ~/.everos/raven so config and data stay isolated from any other EverOS consumer on the machine. Add update_everos.configure_everos_env(): it sets EVEROS_CONFIG_FILE and EVEROS_MEMORY__ROOT via setdefault (so an explicit operator override still wins) before EverOS's @cache-d load_settings() first runs. The everos backend factory and the understand_media tool factory call it as the earliest raven-controlled EverOS entry points; _EVEROS_CONFIG now derives from a single _EVEROS_BASE constant. No data migration: existing ~/.everos data is left untouched and a fresh ~/.everos/raven is created lazily on first write/use. Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
A fresh onboard now materializes the user-facing subset of the memory / plugins / skillForge extension blocks into ~/.raven/config.json so the knobs are discoverable and editable without reading the source. Seeding is setdefault-based (non-clobbering) and runs on every onboard, so it also backfills a pre-existing config that predates these blocks. - memory.backend defaults to "everos" (schema default); _memory_enabled now gates on an llm model being present, so a fresh modelless seed is treated as "not yet enabled" and the skip / non-interactive guard still resolves it to None when memory is opted out or left unconfigured. - skillForge.everos.enabled is seeded on; router.hub.endpoint is seeded to the shared Skill Hub URL with apiKey left null for the user to fill. - plugins.config["everos-memory"] is seeded with identity wiring that mirrors memory.userId / agentId so recall identities match. - internal-infra fields (embedding / reranker endpoints + their API keys, mass_library_db) are NOT written, so a real Bearer token never lands in a plaintext config; they stay at their schema defaults. Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…lt_extension_blocks Feat/onboard default extension blocks
…recall_improvements feat: native short-term memory + everos long-term consolidation
…_memory_recall revert: pr EverMind-AI#9 native short-term memory + everos long-term consolidation
…readme_ci chore: prepare open source launch
## Summary - switch project metadata and license text to Apache-2.0 while retaining upstream notices - add public-ready community files: issue templates, SECURITY, CONTRIBUTING, CODE_OF_CONDUCT, Dependabot, and a stricter PR template - align README license copy with the public launch posture ## Repository settings updated via GitHub API - squash-only merge enabled; merge commit and rebase merge disabled - delete branch on merge and update branch enabled - Discussions enabled; Projects and Wiki disabled - Actions default workflow permissions set to read-only and PR self-approval disabled - description and homepage updated for Raven ## Verification - npm ci --ignore-scripts --no-audit --no-fund (root) - npm ci --ignore-scripts --no-audit --no-fund (ui-tui) - npm ci --ignore-scripts --no-audit --no-fund (bridge) - npx --no-install commitlint --from origin/main --to HEAD --config commitlint.config.cjs - PYTHONPATH=. python3 scripts/check_commit_messages.py origin/main..HEAD - uv run pre-commit run --from-ref origin/main --to-ref HEAD - git diff --check origin/main...HEAD ## Notes - GitHub branch protection/rulesets returned 403 while the repository is private on the current plan. Enable required checks after making the repository public. - Auto-merge remained disabled after the API patch, likely due repository/org availability or policy.
## Summary - add lightweight overview files for top-level repository sections that still displayed old non-conventional commit messages - update existing benchmark and demo READMEs with public-facing guidance - make the GitHub directory listing show a clean conventional commit message after merge without rewriting main history ## Verification - uv run pre-commit run --files LICENSES/README.md benchmarks/README.md demos/README.md docs/README.md raven/README.md tests/README.md - npx --no-install commitlint --from origin/main --to HEAD --config commitlint.config.cjs - PYTHONPATH=. python3 scripts/check_commit_messages.py origin/main..HEAD - uv run pre-commit run --from-ref origin/main --to-ref HEAD ## Note A normal pull request cannot rename historical commits already merged into main. This PR instead updates the affected directories with useful public-facing overview docs so GitHub displays the new conventional commit as the latest directory change.
Bumps [python-socketio](https://github.com/miguelgrinberg/python-socketio) from 5.16.1 to 5.16.2. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/miguelgrinberg/python-socketio/releases">python-socketio's releases</a>.</em></p> <blockquote> <h2>Release 5.16.2</h2> <p>See <a href="https://github.com/miguelgrinberg/python-socketio/blob/main/CHANGES.md">CHANGES.md</a> for release notes.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/miguelgrinberg/python-socketio/blob/main/CHANGES.md">python-socketio's changelog</a>.</em></p> <blockquote> <h1>python-socketio change log</h1> <p><strong>Release 5.16.3</strong> - 2026-06-15</p> <ul> <li>Catch all exceptions in redis and rabbitmq client managers <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1581">#1581</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/80bb5c9b07e6b53e45f610ec29a24124c539d41b">commit</a>)</li> </ul> <p><strong>Release 5.16.2</strong> - 2026-05-21</p> <ul> <li>Prevent unnecessary resource allocations <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1574">#1574</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/ca140fe44d0ceb3004073645222abec182d8784b">commit</a>)</li> <li>Add zizmor to CI builds <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1570">#1570</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/664dc27ec6f34179ed1724430eda3520627fc642">commit</a>)</li> </ul> <p><strong>Release 5.16.1</strong> - 2026-02-06</p> <ul> <li>Use configured JSON module in managers <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1549">#1549</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/6229261ae6e8c01e675097242e333ee84587a544">commit</a>)</li> <li>Admin UI fixes: remove duplicate tasks, report transport upgrades (<a href="https://github.com/miguelgrinberg/python-socketio/commit/1c2eab13a92fac9e43663eb0b5f099eb1c40ea5b">commit</a>)</li> <li>Switch to Furo documentation template (<a href="https://github.com/miguelgrinberg/python-socketio/commit/add47d8c7abca697a2804141bbf29bfb095f7d5e">commit</a>)</li> <li>Add Python free-threading to CI <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1554">#1554</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/ccdd2004a038ae4b8171a05120c5d0787332f7ee">commit</a>)</li> </ul> <p><strong>Release 5.16.0</strong> - 2025-12-24</p> <ul> <li>Address deprecation warnings (<a href="https://github.com/miguelgrinberg/python-socketio/commit/b235699d9b06564753c570b76055997e9d62a938">commit</a>)</li> <li>Drop Python 3.8 and 3.9 from CI builds (<a href="https://github.com/miguelgrinberg/python-socketio/commit/d0728d2f74538762dd551fa9cd0cd1fd5aedfa37">commit</a>)</li> </ul> <p><strong>Release 5.15.1</strong> - 2025-12-16</p> <ul> <li>Restore support multiple arguments via pubsub emits <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1540">#1540</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/c279f26bb8c9887c4ca99d4d81ad331c4844438c">commit</a>)</li> </ul> <p><strong>Release 5.15.0</strong> - 2025-11-22</p> <ul> <li>Retry initial Redis connection <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1536">#1534</a> ([commit <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1">#1</a>](<a href="https://github.com/miguelgrinberg/python-socketio/commit/1e903e173a2d7b04599c4f7f9630c1abbb531fad">https://github.com/miguelgrinberg/python-socketio/commit/1e903e173a2d7b04599c4f7f9630c1abbb531fad</a>) [commit <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/2">#2</a>](<a href="https://github.com/miguelgrinberg/python-socketio/commit/5e898a9b93526e6e667767e54c60f4c84589989d">https://github.com/miguelgrinberg/python-socketio/commit/5e898a9b93526e6e667767e54c60f4c84589989d</a>))</li> <li>Correctly regenerate RabbitMQ binding after a connection failure <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1516">#1516</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/c52e93b4a328d98a968bfbdec0cfd598b73ee913">commit</a>) (thanks <strong>Gritty_dev</strong>!)</li> <li>Support <code>ext_type</code> in the <code>MsgPackPacket</code> class <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1521">#1521</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/208925344a48485d2cd56e40eb74266c3bcb5311">commit</a>)</li> <li>Support sending <code>bytesarray</code>s when using pub/sub managers (<a href="https://github.com/miguelgrinberg/python-socketio/commit/6c9b9974f72e2efdf62407ecab24ee6995448098">commit</a>)</li> <li>Fix typos in documentation <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1520">#1520</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/db3f1c2a0105c30cb833ddfca8f05fe4320468fd">commit</a>) (thanks <strong>Lê Nam Khánh</strong>!)</li> <li>Improvements to the logging documentation (<a href="https://github.com/miguelgrinberg/python-socketio/commit/b423d0e38eef559b7e81acb7e32059de305f982c">commit</a>)</li> </ul> <p><strong>Release 5.14.3</strong> - 2025-10-29</p> <ul> <li>Support Python's native <code>ConnectionRefusedError</code> exception to reject a connection <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1515">#1515</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/f3b18bde3f16437b223491d4c3e440ea37105fe3">commit</a>)</li> <li>Push binary data to the aiopika client manager <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1514">#1514</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/194e1b7f277b5f72e1de78d3f614e7b8b6c788ac">commit</a>)</li> </ul> <p><strong>Release 5.14.2</strong> - 2025-10-15</p> <ul> <li>Restore binary message support in message queue setups <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1509">#1509</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/bab4a10f48aaae11d7f832ebe5c30ad3f85d31b3">commit</a>)</li> <li>Fix formatting of client connection error <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1507">#1507</a> (<a href="https://github.com/miguelgrinberg/python-socketio/commit/f298c9b54d76ab09ff72935937e1b9575bc45ffd">commit</a>)</li> <li>Add 3.14 and pypy-3.11 CI tasks (<a href="https://github.com/miguelgrinberg/python-socketio/commit/1f4cd3b025c294f25208ec3c05b5f8df6209e403">commit</a>)</li> <li>Improve documentation of the <code>BaseManager.get_participants()</code> method (<a href="https://github.com/miguelgrinberg/python-socketio/commit/33722a0d96036f005188b07b8b46a5ef091fe65f">commit</a>)</li> </ul> <p><strong>Release 5.14.1</strong> - 2025-10-02</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/6e2b7175c97c2785edd2ea60df026c12240c785c"><code>6e2b717</code></a> Release 5.16.2</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/cb658291085842372a16863d83e14373f85b3d3e"><code>cb65829</code></a> update python-engineio version</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/ca140fe44d0ceb3004073645222abec182d8784b"><code>ca140fe</code></a> prevent unnecessary resource allocation (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1574">#1574</a>)</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/b29beef6bfd38d5a3c3b89da96b7a4574a91efcf"><code>b29beef</code></a> tox configuration</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/e8981302a3d5b525ee73c2ec9c13859ce2f764e8"><code>e898130</code></a> Bump ujson from 5.4.0 to 5.12.1 in /examples/server/sanic (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1573">#1573</a>) #nolog</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/05c32f5da85fe5e5d647c937c7eab0972760ca05"><code>05c32f5</code></a> Bump qs and body-parser in /examples/server/javascript (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1572">#1572</a>) #nolog</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/287dc6715b801d319f5baa0fb727e232e728b8aa"><code>287dc67</code></a> Bump qs and body-parser in /examples/client/javascript (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1571">#1571</a>) #nolog</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/664dc27ec6f34179ed1724430eda3520627fc642"><code>664dc27</code></a> add zizmor to ci (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1570">#1570</a>)</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/14c62366a85cfe34e0bd69a22b905eb329873dd3"><code>14c6236</code></a> Bump django in /examples/server/wsgi/django_socketio (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1566">#1566</a>) #nolog</li> <li><a href="https://github.com/miguelgrinberg/python-socketio/commit/29b2e5cdbe87e8216bc46fccb864b84ab9f55cf9"><code>29b2e5c</code></a> Bump aiohttp from 3.13.3 to 3.13.4 in /examples/server/aiohttp (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1565">#1565</a>) #nolog</li> <li>Additional commits viewable in <a href="https://github.com/miguelgrinberg/python-socketio/compare/v5.16.1...v5.16.2">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/EverMind-AI/Raven/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Summary AGENTS.md described the repo as rebase-merge, but it is configured squash-only (`squash_merge_commit_message=PR_BODY`; rebase and merge-commit disabled). Correct 3.3, 3.5, and 3.7 to the real policy: rebase only freshens the branch before push, squash on merge; the squash commit body comes from the PR description (commit bodies are dropped), and GitHub auto-collects each commit's `Co-authored-by` -- so keep the trailer in the commit and put `Closes` / reviewer context in the PR description. ## Type - [x] Docs ## Verification Docs-only. Policy verified against `gh api repos/EverMind-AI/Raven` (squash-only, `PR_BODY`) and as observed on the EverMind-AI#95 squash commit. - [x] User-facing docs or screenshots are updated when needed ## Risk Docs-only; no code or behavior change. ## Related Issues N/A Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…Mind-AI#97) ## Summary Give channel field specs a single source of truth for required/optional: the schema declares it, `channels show` displays it, and the onboard wizard uses it. This fixes the onboard wizard's `idx>0` heuristic, which showed an "empty to skip" hint on required non-first fields (e.g. feishu `app_secret`) — inviting users to skip a credential the channel needs to start. - Mark required fields with `Field(json_schema_extra={"required": True})`, mirroring the existing `is_secret` escape hatch. Defaults are kept, so `ChannelsConfig`'s `default_factory` construction of every channel still loads (no config migration). - `_flatten_fields` exposes a `required` spec key; `channels show` gains a `Required?` column. - The wizard gates the skip hint on the marker. This drops the misleading hint only — empty submits are still silently ignored as before (no new enforcement added). Required sets were audited against each adapter's `start()` guard across all 12 channels. matrix / whatsapp / weixin have no hard guard and are marked by product judgment. Scope is channels only; providers share the spec model but their table is left unchanged. ## Type - [x] Feature ## Verification - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally ``` uv run pytest tests/test_config_update_channels.py tests/test_cli_channel_commands.py \ tests/test_cli_onboard_commands.py tests/test_channels_required_marker.py -q # 183 passed uv run ruff check <changed files> # All checks passed uv run ruff format --check <changed files> # already formatted ``` ## Risk - [x] Backward compatibility considered `json_schema_extra` is inert metadata: no change to validation, serialization, or how config.json is read/written. Existing configs load unchanged. ## Related Issues Fixes EverMind-AI#84 Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…d-AI#98) ## Summary A non-ASCII PR body slipped onto main via EverMind-AI#97: the repo squash-merges with the PR description as the commit body, but nothing checked that body before merge, so an em-dash only tripped the post-merge commit lint on main (too late to fix cleanly). Close the gap at both the guidance and the enforcement layer. - Enforcement (CI): add `check_pr_body` (ASCII-only, reusing `commit_lint._is_ascii`) and a "Validate PR body" step in the pull_request job, so a non-ASCII PR body fails the PR check before merge and points at the offending line. - Guidance (AGENTS.md 3.7): the preview grep now uses `[^\x00-\x7F]` (any non-ASCII), not a CJK-only pattern that gave a false pass. - Guidance (AGENTS.md 3.1.1): state the punctuation rule is ASCII-only, not merely no-full-width (calls out em-dash / curly quotes / ellipsis). ## Type - [x] CI / tooling - [x] Docs ## Verification - [x] Relevant tests pass locally ``` uv run pytest tests/test_commit_lint.py -q # 12 passed PR_BODY="line with a non-ascii dash" python3 scripts/check_pr_body.py # exit 1, flags line python3 scripts/check_commit_messages.py "origin/main..HEAD" # PASS grep -nP "[^\x00-\x7F]" <this body> # 0 matches ``` ## Risk - [x] Backward compatibility considered The new check runs in the existing required pull_request job, so it is enforced immediately without a new required-check name. ASCII-only PR bodies are already implied by the squash-to-main constraint, so this only moves the check earlier (pre-merge instead of post-merge). ## Related Issues N/A (follow-up to the commit-lint failure on EverMind-AI#97) --------- Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…ns (EverMind-AI#99) ## Summary `release.yml` only uploaded the built wheel to Actions artifacts, so a pushed tag never produced a downloadable Release asset. `install.sh` resolves the wheel from the latest Release asset, so a tag silently kept serving the old version until someone manually created the Release and attached the wheel. This builds a draft Release with the wheel and sdist attached (cutting a release becomes one review plus a Publish click), and documents the conventions in RELEASING.md. - **release.yml**: on a version tag, create a draft GitHub Release with the wheel + sdist attached, a dated title, and notes prefilled from a template. Idempotent re-runs (list endpoint + delete a stale draft, keeping the tag); prerelease tags (`vX.Y.Z-rcN`) stay out of `/releases/latest`; the tag is guarded against the pyproject version; adds `concurrency` and aligns action versions with ci/commits. - **RELEASING.md** + **.github/release-notes-template.md**: the release conventions and the CI notes skeleton. Publishing stays a deliberate human step -- CI only creates the draft. ## Type - [x] CI / tooling ## Verification Local (macOS): - `actionlint` (with shellcheck on the run blocks) clean on release.yml. - YAML parses; the version/prerelease shell logic and template substitution run correctly against the real pyproject and tag values. - Idempotency detection verified against the live releases API (published tag -> left alone; missing tag -> create). - Not yet run end to end on a GitHub runner. Before the first stable release, a `vX.Y.Z-rc1` tag will dry-run the full draft/attach/idempotency path -- a prerelease never becomes `/releases/latest`, so users are unaffected. - [ ] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes The job gets `contents: write` (needed to create the Release). No behavior change until a version tag is pushed; the workflow is dormant otherwise. Rollback: revert the commit. ## Related Issues N/A Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…nd-AI#94) ## Summary Progressive tool disclosure previously exposed three meta-tools: `tool_search`, `tool_describe`, and `tool_call`. `tool_describe` was a separate round-trip to fetch a hidden tool's parameter schema after `tool_search`. This PR collapses the flow to two meta-tools: - **Drop `tool_describe`.** `tool_search` now returns each hit's parameter schema alongside its name and description, so the model can go straight to `tool_call`. When arguments don't fit the schema the registry already returns a correctable validation error, so the extra lookup step added no correctness. - **Index tool parameter schemas.** Parameter names, their descriptions, and enum values are folded into the BM25 index body (`name` x3 + description + schema keywords). Discriminating keywords often live in the schema rather than the one-line description (a repo owner, a channel id, an image size), so indexing them lifts retrieval recall without changing the schema the model sees. The index signature now keys on `(name, description, parameters)`, so a parameter change under hot-reload correctly triggers a rebuild. Offline validation on the ToolRet benchmark (7,961 queries, 44k-tool corpus, Raven's own BM25 kernel) shows folding the schema into the index consistently lifts nDCG@10 by ~4-5 points over indexing name + description alone. ## Type - [ ] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [x] Refactor - [ ] Other ## Verification ``` uv run pytest tests/test_tool_search.py tests/test_agent_loop_tool_search.py -q # 35 passed uv run ruff check raven/agent/tools/tool_index.py raven/agent/tools/tool_search.py \ raven/config/schema.py tests/test_tool_search.py tests/test_agent_loop_tool_search.py # All checks passed! uv run ruff format --check raven/agent/tools/tool_index.py raven/agent/tools/tool_search.py \ tests/test_tool_search.py # already formatted ``` New unit coverage: schema-keyword extraction (names, descriptions, enums, nesting, depth cap, non-dict input), rebuild-on-parameters-change, search hits carrying parameters, meta-tool set no longer including `tool_describe`. - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [ ] User-facing docs or screenshots are updated when needed ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes Progressive tool disclosure is opt-in (`tools.tool_search.enabled` defaults to false), so the default agent path is unaffected. `tool_describe` is an internal meta-tool with no public API; removing it changes only the enabled-feature flow. `tool_search` hits are larger now (they carry parameter schemas), but only when the model actively searches - the per-turn tool list and prompt-cache prefix are untouched. Rollback: revert the branch. ## Related Issues N/A --------- Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
EverMind-AI#102) ## Summary Harden the `raven onboard` wizard, which reported false "connected" results, could trap or crash mid-flow, and billed silently in CI. One file (`raven/cli/onboard_commands.py`) plus its tests; no schema/config changes. - Real verification instead of a connectivity check: memory LLM and embedding send a real `POST /chat/completions` / `/embeddings` probe (was `GET /models`, which greenlit models the endpoint doesn't serve); custom providers are probed too. Embedding takes the model id directly instead of showing a misleading chat-model list. A malformed base_url no longer crashes (catches `InvalidURL`). - No dead ends: test-message failure offers Re-enter key / Switch provider; a required EverOS role can give up EverOS (keep Markdown) instead of looping; the main-model empty submit uses the default instead of exiting; Ctrl+C exits every menu; Step 1 requires at least one provider and a default model; required channel fields re-prompt on empty; scancode reverts the enable on any non-login exit. - Config safety: a failed provider config is cleared or restored on switch; `_memory_enabled` requires both llm and embedding; key / URL / channel inputs are stripped. - `--skip-test` skips the billed test call (connectivity is still checked); the capability hint no longer renders like an error; `--reset` help and setup warnings clarified. ## Type - [x] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [ ] Other ## Verification - `uv run pytest tests/test_cli_onboard_commands.py -q` -> 88 passed; ruff check/format clean. - Real DeepSeek: probes reject wrong / chat-only models (HTTP 400 / 404) and pass a valid one; `send_probe` returns a real reply and raises on a bad model; a malformed base_url returns no list without crashing; `--skip-test` skips the chat call while a control run sends one. - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [ ] User-facing docs or screenshots are updated when needed ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes `--skip-test` defaults off, so non-interactive behavior is unchanged; no schema/config changes; rollback is reverting the branch. ## Related Issues Fixes EverMind-AI#81 --------- Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…verMind-AI#101) ## Change description DeepSeek thinking mode rejects a follow-up turn whose replayed assistant message carried a tool call, with "reasoning_content must be passed back to the API". The two history-projection allowlists dropped `reasoning_content` / `thinking_blocks`, so the rebuilt assistant history lost them. Both keys are now preserved in `_history_from_messages` (Curator) and `_ALLOWED_KEYS` (HistoryTrimmer); the provider gate still strips `thinking_blocks` for non-Anthropic targets. The token estimators (`estimate_prompt_tokens` / `estimate_message_tokens`) now count both fields as well, so the preserved payload does not overflow the trim budget on long multi-turn thinking chains. ## Type of change - [x] Bug fix - [ ] New feature - [ ] Document - [ ] Others ## Related issues Fixes EverMind-AI#89 ## Checklists ### Development - [x] Lint rules pass locally - [x] Application changes have been tested thoroughly - [x] Automated tests covering modified code pass ### Security - [x] Security impact of change has been considered - [ ] Code follows security best practices and guidelines ### Code review - [x] Pull request has a descriptive title and context useful to a reviewer. Screenshots or screencasts are attached as necessary Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…ification (EverMind-AI#103) ## Change description Upgrade EverOS from 1.0.1 to 1.1.2 and overhaul the onboard memory configuration step with per-provider intelligence, model verification, and UX improvements. ### EverOS 1.1.2 upgrade - Bump `everos[multimodal]` from 1.0.1 to 1.1.2 in pyproject.toml - Adapt to config file rename: `config.toml` -> `everos.toml` - Switch env vars from `EVEROS_CONFIG_FILE` + `EVEROS_MEMORY__ROOT` to single `EVEROS_ROOT` - Handle exception class split: `MultimodalError` -> `MultimodalNotEnabledError` + `UnsupportedModalityError` ### EverOS home initialization - Add `ensure_everos_home()`: copies `everos.toml` + `ome.toml` from shipped templates on first run, with legacy `config.toml` auto-migration - Called from `make_backend`, `make_understand_media_tool`, and onboard step 4 ### LanceDB schema auto-migration - Add `_migrate_lancedb_schemas()`: detects missing columns (e.g. `deprecated_by`) and adds them via `pyarrow` - `_acquire_embedded_everos()` catches `LanceDBSchemaMismatchError`, runs migration, retries lifespan - Eliminates the need for users to manually clear and rebuild LanceDB indexes on upgrade ### Per-provider model fetching - Expand `_EVEROS_PROVIDERS` to 6 entries (add DeepInfra) with `supports` capability sets and `rerank_provider`/`rerank_base_url` fields - Provider-specific model listing APIs: - OpenRouter: `/embeddings/models` for embed, `?output_modalities=rerank` for rerank, `?input_modalities=image` for multimodal - DeepInfra: `/models/list` with `reported_type` filter (shared `_fetch_deepinfra_models` helper) - SiliconFlow: query params `sub_type=embedding` / `sub_type=reranker` - DashScope: fixed rerank list `["gte-rerank-v2"]` - Only show providers that support the current role (e.g. DeepSeek excluded from embedding choices) ### Per-role model verification - LLM: real `POST /chat/completions` probe (from PR EverMind-AI#102) - Embedding: two-step MRL dimension probe -- try `dimensions=1024` first, fall back to native dim check; reject models that cannot produce 1024-dim vectors - Rerank: provider-specific probe dispatching to vllm (`/rerank`), deepinfra (`/{model}`), or dashscope (`/api/v1/services/rerank/text-rerank/text-rerank`) - Multimodal: `POST /chat/completions` probe - Each verifier is a peer-level function dispatched by section in `_config_everos_role` ### Onboard UX improvements - Model recommendations displayed after fetching model list (gpt-4.1-mini / Qwen3-Embedding-4B / Qwen3-Reranker-4B / gemini-3-flash-preview) - Immediate autocomplete popup via `prompt_toolkit` `pre_run_callables` - Default-select LLM provider for embed/rerank/multimodal steps with auto API key reuse - Auto-resolve rerank service type from provider dict (no manual selection) - Wording: "Disable" -> "Skip", "dimension correct" -> "supports 1024-dim" - Multimodal purpose text alignment ### Integration test isolation - Set `EVEROS_ROOT` to tmp_path in test fixtures and e2e subprocess env - Copy `everos.toml` + `ome.toml` from real root before redirect - Reset `_embedded_lifespan_cm` and `_embedded_lifespan_refs` between tests ## Type of change - [x] Bug fix - [x] New feature - [ ] Document - [ ] Others ## Related issues (if there is) Depends on PR EverMind-AI#102 (merged) ## Checklists ### Development - [x] Lint rules pass locally - [x] Application changes have been tested thoroughly - [x] Automated tests covering modified code pass ### Security - [x] Security impact of change has been considered - [x] Code follows security best practices and guidelines ### Code review - [x] Pull request has a descriptive title and context useful to a reviewer. Screenshots or screencasts are attached as necessary Co-authored-by: Claude (claude-opus-4-6) <noreply@anthropic.com> --------- Co-authored-by: Jiayao Song <jiayao.song@shanda.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-AI#105) ## Change description The TUI `/model` picker showed an empty model list for direct providers (DeepSeek, OpenAI, Anthropic, Gemini, Zhipu, Groq, DashScope): their config `models` default to `[]` and `COMMON_MODELS` seeded only openrouter, so the curated fallback the picker reads was empty. This seeds a curated, chat-only shortlist for each of those providers, refreshes the openrouter shortlist from real usage rankings, and gives each seeded provider a non-empty `default_model`: - deepseek moves off the soon-deprecated `deepseek-chat` (its official successor is `deepseek-v4-flash`, same economy tier); - zhipu, dashscope and groq previously had no `default_model` at all; - openai and anthropic move to current-generation flagships. Model ids were verified against litellm 1.85.0, provider docs, and OpenRouter usage data, not guessed. Live dynamic model fetching (hermes-style per-provider `/v1/models`) was evaluated and deferred as a separate follow-up: litellm gives no clean live catalog for the direct providers, so it does not solve this case. Note: unauthenticated providers now also surface the curated shortlist in the picker, consistent with openrouter's existing behavior; the auth state is conveyed separately. ## Type of change - [ ] Bug fix - [x] New feature - [ ] Document - [ ] Others ## Related issues Fixes EverMind-AI#100 ## Checklists ### Development - [x] Lint rules pass locally - [x] Application changes have been tested thoroughly - [x] Automated tests covering modified code pass ### Security - [x] Security impact of change has been considered - [ ] Code follows security best practices and guidelines ### Code review - [x] Pull request has a descriptive title and context useful to a reviewer. Screenshots or screencasts are attached as necessary Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary Prepare Raven 0.1.3 by updating the package version, runtime version, and lockfile project entry from 0.1.2 to 0.1.3. After this change is merged, a `v0.1.3` tag can pass the release workflow version guard and create a draft GitHub Release with wheel and source distribution assets. This pull request does not create a tag or publish a release. ### Proposed release notes Raven 0.1.3 makes setup and TUI use more dependable with working EverOS memory, verified model onboarding, curated model choices, and stronger session reliability. #### Highlights - EverOS memory now works out of the box in the TUI, with managed embedded-backend startup and shutdown. - `raven onboard` now verifies real chat, embedding, rerank, and multimodal requests, offers safer recovery paths, and upgrades EverOS to 1.1.2 with automatic first-run config and LanceDB schema migration. - The TUI `/model` picker now includes curated choices for OpenRouter and the DeepSeek, OpenAI, Anthropic, Gemini, Zhipu, Groq, and DashScope direct providers. - Large tool catalogs can opt into progressive tool disclosure, keeping per-turn tool payloads bounded while models search and call hidden tools on demand. - Subagent results now return to the session that launched them, and repeated spawns no longer leak skill file watchers. - Cancelling a streamed TUI turn now keeps partial assistant output in the transcript, and CLI shutdown avoids a LanceDB-related exit crash. - Thinking-mode conversations now preserve reasoning fields across trimmed history, fixing DeepSeek follow-up turns that include tool calls. - Standard macOS, Linux, and Windows installers now include channel SDKs by default and show install-mode-aware recovery guidance for missing dependencies. #### Install ```bash curl -fsSL https://raven.evermind.ai/install.sh | bash ``` Then reload your shell and run: ```bash raven onboard ``` #### Release status - Version: `0.1.3` - Tag: `v0.1.3` - Stability: public preview patch - Assets: wheel and source distribution attached to the release #### Notes - Raven is still pre-1.0; CLI surfaces, plugin contracts, and runtime internals may continue to evolve. - PyPI publishing is not enabled yet; the supported public install path uses the GitHub Release wheel asset. ## Type - [ ] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [x] Other ## Verification - `uv lock --check` - Version consistency check confirms `pyproject.toml`, `raven.__version__`, and `uv.lock` use `0.1.3`. - `git diff --check` - The full test suite is not marked passing: the local baseline includes environment-dependent EverOS integration failures and unrelated host-state failures. - [ ] Relevant tests pass locally - [ ] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes This is a metadata-only version bump. Rollback is a revert before tagging. ## Related Issues N/A
## Summary - Always start the interactive Codex OAuth flow when the user explicitly selects OAuth login, even when a cached token exists. - Upgrade `oauth-cli-kit` from 0.1.3 to 0.1.6 for headless browser detection and manual callback fallback. - Pass Raven's Linux graphical-session detection into the OAuth login flow. - Add regression coverage for cached-token reauthentication and headless Linux sessions. The login handler previously read a cached Codex token before starting OAuth. When that token was valid, Raven skipped `login_oauth_interactive()` entirely, so selecting Codex OAuth during onboarding did not open a browser. The handler now treats an explicit login action as a request to authenticate interactively and launches the browser flow every time. Headless Linux sessions still use the manual authorization URL and redirect-URL prompt instead of waiting for a browser callback that cannot arrive. ## Type - [x] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [ ] Other ## Verification - `uv run pytest tests/test_cli_provider_commands.py tests/test_cli_onboard_commands.py -q` (`87 passed`) - `uv run pre-commit run --files pyproject.toml raven/cli/provider_commands.py tests/test_cli_provider_commands.py uv.lock` - `make lint-python && make test-python` (`18 passed`) - Local commit-message and PR-title lint scripts - Manual macOS verification through `raven onboard`: selecting `Codex (OAuth)` opened the OpenAI authorization page in the default browser with an existing cached token. The flow was cancelled before account authorization. - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [ ] User-facing docs or screenshots are updated when needed ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes Normal provider usage continues to reuse stored OAuth credentials. Only an explicit login action now forces the interactive authorization flow. ## Related Issues Fixes EverMind-AI#108
## Summary - Add `raven upgrade --check` and `raven upgrade` for the latest stable GitHub Release wheel. - Reject editable and unsupported installs, validate release and installation metadata, target the active uv tool directories, and preserve all state under `~/.raven`. - Keep POSIX replacement synchronous. On Windows, launch a whitespace-safe external helper, wait for the uv trampoline to exit, and then replace the unlocked tool. - Add a real uv self-upgrade integration test on Windows, block upgrades inside the active TUI, and document the manual user workflow in both READMEs. Windows returns after scheduling the helper because the running `raven.exe` must exit before uv can replace it. Users must wait for the helper completion message before running Raven again. ## Type - [ ] Fix - [x] Feature - [x] Docs - [x] CI / tooling - [ ] Refactor - [ ] Other ## Verification - `uv run pytest tests/test_cli_upgrade_commands.py tests/integration/test_cli_upgrade_real_uv.py tests/test_cli_smoke.py tests/test_tui_rpc_cli_dispatch.py tests/test_tui_rpc_commands_catalog.py -q` - 187 passed - `uv run ruff check raven/cli/upgrade_commands.py raven/cli/commands.py raven/tui_rpc/methods/cli_dispatch.py tests/test_cli_upgrade_commands.py tests/integration/test_cli_upgrade_real_uv.py tests/test_cli_smoke.py tests/test_tui_rpc_cli_dispatch.py` - passed - `uv run ruff format --check raven/cli/upgrade_commands.py raven/cli/commands.py raven/tui_rpc/methods/cli_dispatch.py tests/test_cli_upgrade_commands.py tests/integration/test_cli_upgrade_real_uv.py tests/test_cli_smoke.py tests/test_tui_rpc_cli_dispatch.py` - passed - `npm test --prefix ui-tui -- src/__tests__/branding.test.tsx` - 13 passed - `npm run lint --prefix ui-tui` - passed with 0 errors and 22 existing warnings - `npm run lint:rpc --prefix ui-tui && npm run type-check --prefix ui-tui` - passed - `make check-commits && PR_TITLE='feat(cli): add raven upgrade command' make check-pr-title && make check-large-files` - passed - Native Windows end-to-end confirmation is provided by the `Windows self-upgrade` PR check. - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes ## Related Issues Closes EverMind-AI#111
…port (EverMind-AI#92) File-based USER/PROJECT plugins ship their factory module inside the plugin directory (~/.raven/plugins/<id>/), which nothing put on sys.path. Discovery found the manifest but _resolve_factory's bare importlib.import_module always failed — a self-contained plugin dropped into the user dir could never load. activate() now threads each DiscoveredPlugin's source and location into _activate_one, which calls _ensure_importable before resolving factories: for USER/PROJECT plugins it appends (not prepends, so installed packages keep priority) the plugin directory to sys.path, guarded for idempotency. BUNDLED (in-package) and ENTRY_POINTS (installed) are untouched. Add regression tests that write real on-disk factory packages (not pre-seeded into sys.modules) under user/project dirs and assert the backend/tool build end to end. ## Summary <!-- What changed, and why? --> ## Type - [ ] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [ ] Other ## Verification <!-- List the exact commands you ran and the result. --> - [ ] Relevant tests pass locally - [ ] Relevant lint / type checks pass locally - [ ] User-facing docs or screenshots are updated when needed ## Risk - [ ] Security impact considered - [ ] Backward compatibility considered - [ ] Rollback path is clear for risky changes Co-authored-by: libin.zhang <libin.zhang@shanda.com>
## Change description Fixes a fresh-install crash where every real turn fails with `APIConnectionError: OpenrouterException - No module named 'orjson'` (shown in the TUI as the generic `turn_failed (code=-32099)`). Root cause: litellm's request path imports `orjson` at runtime, but litellm only declares it under its `proxy` extra, which raven does not install. So `orjson` was absent from raven's dependency graph entirely (not in `pyproject.toml`, not in `uv.lock`). Any install (`git clone && uv sync`, or the release wheel) therefore lacked it, and the first message a user sends crashes the turn. Fix: declare `orjson` as a direct runtime dependency so every install resolves it. Verified locally: a turn that previously failed with the missing-orjson error now completes normally after the dependency is declared. ## Type of change - [x] Bug fix - [ ] New feature - [ ] Document - [ ] Others ## Related issues Closes EverMind-AI#113 ## Checklists ### Development - [x] Lint rules pass locally - [x] Application changes have been tested thoroughly - [ ] Automated tests covering modified code pass ### Security - [x] Security impact of change has been considered - [x] Code follows security best practices and guidelines ### Code review - [x] Pull request has a descriptive title and context useful to a reviewer Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
## Summary Bump project version 0.1.3 -> 0.1.4 to cut the next patch release. Ships the four fixes/features merged since v0.1.3: `raven upgrade` command (EverMind-AI#112), onboard oauth browser login (EverMind-AI#110), plugin dir on sys.path (EverMind-AI#92), and orjson as a direct dependency (EverMind-AI#116). Lockfile synced via `uv lock`. ## Type - [ ] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [x] Other ## Verification - [x] Relevant lint / type checks pass locally ``` python3 scripts/check_commit_messages.py origin/main..HEAD # pass uv lock # raven 0.1.3 -> 0.1.4 ``` ## Risk - [x] Backward compatibility considered Version-only bump; no runtime code changed. The release tag (v0.1.4) is pushed after this merges. ## Related Issues N/A Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…act (EverMind-AI#135) ## Summary Add an in-tree tracing subsystem and adopt it across raven, giving every run a structured `audit.span.v1` trace (turn -> model / tool / memory / skill / subagent) viewable in a bundled dashboard. The design keeps raven and tracing decoupled so they can iterate independently, coupled only by a small contract: - **tracing owns the standard.** `raven/tracing` exposes a thin facade (`trace.span` / `@trace.instrument`) over an `audit.span.v1` record format, a set of semantic conventions, and a dependency-free Node viewer. Custom nodes are supported with no registration (any owned `<domain>.<verb>` name). - **raven adopts it as a pure consumer.** Instrumentation is one import + one `@trace.instrument` decorator per method; **method bodies are untouched**. Purposes self-nest via contextvars, so a model call under `skill.gate`, `memory.extract`, `subagent.run`, etc. is distinguished by its parent node and by a derived `llm.invocation_source` (nearest non-model ancestor). - **tracing can never break raven.** The facade is no-op when disabled (`[tracing]` config or `RAVEN_TRACING=0`) and swallows its own failures while re-raising the application's exception unchanged. Open the dashboard with `raven tracing` (or `/tracing` in the TUI). Key node behavior: all skill pulls (`use_skill` / `read_skill` / a `read_file` of a SKILL.md) unify into one `skill.read` node, differentiated by content (`skill.read.via_tool`, and `skill.scripts_dir` when a runnable bundle was materialized) rather than by tool name. ## Type - [x] Feature ## Verification - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed Commands run: - `uv run pytest tests/test_tracing_api.py -q` -> 20 passed (nesting, kinds, attributes, artifacts, retype, invocation_source, and the frozen contract + non-interference gates). - `uv run pytest tests/ -q` -> 4091 passed, 85 failed, 12 errors. The failures are pre-existing and unrelated: an identical run with `RAVEN_TRACING=0` (this change fully inert) produces the byte-identical failing set, so this change adds zero failures. The failures are environment-only (TUI subprocess e2e, EverOS real-LLM, sandbox VM, npx MCP) plus a pre-existing async-mock ordering issue in the sentinel/attention suite (passes in isolation). - `uv run ruff check` / `uv run ruff format` -> clean. - Verified at runtime: raven core diff is annotation-only (each touched file is +2 lines: one import, one decorator); disabled pass-through and internal- failure isolation confirmed by dedicated tests. ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes Backward compatibility: additive only. No existing behavior changes; tracing is observation-only and defaults can be turned off with `RAVEN_TRACING=0`. Rollback: revert the branch, or disable via config; raven runs identically without it. Note: `raven/tracing/instrument.py` monkeypatch path is gone; all instrumentation is explicit decorators in raven's own source. Coverage note: the personalizer's four steps (which call `provider.chat` directly) are instrumented as `personalize.*` purpose spans, so no model activity is untraced. The only remaining follow-up is the standalone-OSS extraction (import-optional shim, move raven-specific extractors out, drop raven branding) -- a planned separate phase that ships tracing as its own package, out of scope for this PR. ## Related Issues N/A --------- Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary
Integrate MiroThinker as an async `deep_research` tool, end to end.
- **Tool + streaming** (`feat(agent)`): add the `deep_research` tool
with CLI/TUI streaming.
- **Async channel delivery** (`feat(agent)`): a `deliver_text` turn
primitive delivers the research result to channels verbatim
(out-of-band), since a MiroThinker run is minute-scale and must not
block the turn.
- **CLI config + onboard** (`feat(cli)`): `raven deep-research
enable/get/reset` plus an onboard step so users configure the tool
without hand-editing `config.json`. Key validation uses the free `GET
/v1/models` probe (a `/chat/completions` ping would trigger a full
billed research run).
- **Config write-safety fix** (`fix(config)`): every config-write
command shared a raw reader that swallowed a JSON parse error and
returned `{}`, so writing over a present-but-unparseable `config.json`
(e.g. one with `//` comments) wiped the whole file down to just the
command's own section. Found while testing `deep-research enable` on a
real config. A single shared `read_raw_or_raise` now raises
`ConfigReadError` for a present-but-unparseable file; all six raw
read-modify-write points converge on it, and the CLI surfaces it once,
cleanly, leaving the file untouched.
## Type
- [x] Feature
## Verification
- `uv run pytest` (config layer + deep-research/onboard/provider CLI +
tui_rpc config + cli smoke): **340 passed**.
- `uv run ruff check` on all touched files: clean.
- Real-machine (isolated): async `deep_research` result delivered to a
WeChat channel verbatim; onboard step walked; `deep-research enable`
against a malformed `config.json` refuses with a friendly message and
leaves the file byte-identical (verified with `cmp`).
- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed
## Risk
- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes
## Related Issues
N/A
---
Reviewer notes:
- Mixed-topic PR on purpose: it is a `feat` (deep_research) that also
carries the `fix(config)` bug it exposed; the squash commit takes the
`feat(agent)` title and GitHub collects both `Co-authored-by` trailers.
- Full `uv run pytest` still shows env-dependent failures (sandbox VM,
TUI Ink/Node E2E, missing channel SDKs) that predate this branch; the
tests covering the code changed here (340) pass. A base comparison to
confirm none are new is still pending.
- The MiroThinker test key used for real-machine checks is isolated and
is not committed anywhere in this branch.
---------
Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary Bump version from 0.1.4 to 0.1.5 for release. Two feature PRs landed on main since v0.1.4: - EverMind-AI#136 feat(agent): integrate mirothinker deep_research tool - EverMind-AI#135 feat(tracing): in-tree tracing subsystem with decoupled adopter contract Only pyproject.toml and uv.lock change (version field synced via `uv lock`). ## Type - [ ] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [x] Other ## Verification - [x] Relevant lint / type checks pass locally Ran `uv lock` to sync the lockfile; commit-message lint passes (`check_commit_messages.py`). ## Risk - [x] Backward compatibility considered Version-only bump; no source changes. ## Related Issues N/A Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
) ## Change description `raven --version` printed a stale `0.1.3` even after the release bump to `0.1.5`. The root cause: `raven/__init__.py` carried a hand-written `__version__` literal that the release flow (which edits only `pyproject.toml`, per `RELEASING.md`) never updated -- a hidden second source of truth. This derives `__version__` from installed package metadata (`importlib.metadata.version("raven")`, with a `PackageNotFoundError` fallback), matching the existing in-repo pattern in `cli/upgrade_commands._current_version` and `tui_rpc/methods/system._raven_version`. Now `raven --version`, the TUI intro banner, and `pyproject.toml` all resolve to a single source of truth through the installed dist-info. Added `test_version_flag_matches_installed_metadata` to `tests/test_cli_smoke.py`, asserting the flag output equals the installed metadata version (not a pinned literal, so it can never re-introduce drift). Out of scope: the slow `raven --version` startup (litellm eager import) is a separate, pre-existing perf concern tracked alongside EverMind-AI#128, not addressed here. ## Type of change - [x] Bug fix - [ ] New feature - [ ] Document - [ ] Others ## Related issues (if there is) Fixes EverMind-AI#138 ## Checklists ### Development - [ ] Lint rules pass locally - [x] Application changes have been tested thoroughly - [x] Automated tests covering modified code pass ### Security - [x] Security impact of change has been considered - [ ] Code follows security best practices and guidelines ### Code review - [x] Pull request has a descriptive title and context useful to a reviewer. Screenshots or screencasts are attached as necessary Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…EverMind-AI#141) ## Summary Harden `raven tracing` so it never opens the browser onto a "Not found" page. The launcher treated *any* listener on the dashboard port as its own running viewer: `_open_dashboard` only checked whether the TCP port was live, then pointed the browser at it. A stale viewer from an older on-disk layout (its `index.html` was later replaced by an inlined `shell.js`) -- or an unrelated server -- holding that port answered every request with `404 Not found`, so `/tracing` opened a broken page. Fix: probe `GET /api/health` before reusing a live port. - Reuse the port only when it answers `{"ok": true}` (our viewer's signature; a foreign or stale server does not). - If the port is held by something else, start the viewer on the next free port instead of clashing (or error clearly if none is free nearby). - Readiness now waits on `/api/health` succeeding rather than a bare TCP connect, so we only open the browser once the viewer actually serves. ## Type - [x] Fix ## Verification - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally Commands run: - `uv run pytest tests/test_cli_tracing_commands.py -q` -> 4 passed (health false when nothing listening / false for a foreign 404 server / true for our viewer / free-port scan skips an occupied port). - `uv run ruff check raven/cli/tracing_commands.py tests/test_cli_tracing_commands.py` -> clean. - Reproduced the original bug on a real machine: a stale viewer process held 4318 and returned `404 Not found` for `/`; with this change the launcher detects it is not our viewer and moves to a free port. ## Risk - [x] Security impact considered - [x] Backward compatibility considered Backward-compatible: same behavior when the port is free or already hosts our viewer; only the "foreign process on the port" case changes (previously a broken page, now a working viewer on another port). No API or schema change. ## Related Issues N/A -- follow-up hardening on the tracing viewer merged in EverMind-AI#135. Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary Every `raven` command imported litellm eagerly, and litellm was ~85% of the ~2.35s cold start -- so even `raven --version` paid the full tax. This defers litellm to the code paths that actually need a model: - Drop the top-level `import litellm` in the CLI entry module. - Make `raven.agent` and `raven.providers` PEP 562 lazy re-exports, so importing a submodule no longer eagerly constructs `AgentLoop` -> litellm (0 in-repo callers of the re-exports, so no behavior change). - Route every litellm import through a single `import_litellm()` helper that silences litellm's "Provider List" banner and suppresses its import-time DEBUG from the terminal (litellm installs its own stderr handler and logs while importing; the deferred import happens after raven's CLI logging setup, so the helper keeps that noise off the terminal / Ink TUI). Result: `raven --version` starts in ~0.4s (from ~2.35s). Verified the everos memory substrate was never on the startup path; it was not the bottleneck. ## Type - [ ] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [x] Other ## Verification - `raven --version`: ~2.35s -> ~0.4s (direct `.venv/bin/raven`). - `python -X importtime -c "import raven.cli.commands"`: 0 litellm. - Real logging path (`redirect_loguru_to_file` + provider import) and an interactive `raven tui`: 0 `LiteLLM:DEBUG` lines leaked to the terminal. - `make test-python` (now includes `test_cli_smoke.py` + `test_litellm_setup.py`). - Affected suites (agent loop / providers / token_wise / tui logging isolation): pass. - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [ ] User-facing docs or screenshots are updated when needed ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [ ] Rollback path is clear for risky changes ## Related Issues Fixes EverMind-AI#142 Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…EverMind-AI#140) ## Summary Port the harness self-evolution framework onto Raven and grow it into a runnable, benchmark-pluggable stack: a budget-bounded loop that diagnoses failing trajectories, designs candidate patches as real git commits, screens them cheaply, confirms survivors, and promotes only what passes three verification gates -- with a sealed test set for an honest generalisation number. - **Evolution machinery** (`raven/evolver/`): orchestrator state machine (seven-step funnel), three verification gates (infra validity, beacon attribution, paired significance), sealed-test runner with retention, git-backed candidate tree, judge, taxonomy, activation ledger. - **AppWorld bench** (`benchmarks/appworld/`): agent_cli, batch scorer with trial-level resume and an infra-rerun ladder, plus the evolve glue (designer, diagnosis, adapter, Gate0 precheck with real-generation probing). - **Unified entry**: `python -m raven.evolver {check,run,status,finalize}` drives cold start -> rounds -> terminate -> unseal as a resumable state machine. Config drift and unseal one-wayness are mechanized in run meta; benches plug in via a documented contract (`docs/specs/evolve-bench-contract.md`). - **Designer feedback**: inert-death loop (pruned_inert status, per-WHY history, gentle decay) so unreachable triggers teach the next attempt. - **Launch hygiene**: `check` runs the bench Gate0 precheck, so a dead subject endpoint fails at check time instead of at cold start; ephemeral eval/edit worktrees live under `work_dir/tmp` and hard-kill leftovers are swept on the next launch of the same run. - **Docs**: SOP translation (internal details redacted), SOP-to-code map, bench plugin contract, and a user README with security notes and known limitations. ## Type - [ ] Fix - [x] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [ ] Other ## Verification - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed Commands run: - `uv run pytest tests/test_evolver_launch.py tests/test_evolver_launch_e2e.py -q` -> 56 passed (config, guards, trial-level idempotency, interrupt -> resume -> finalize with a fake bench, check precheck pass/fail, worktree sweep). - `uv run ruff check` on all touched files -> no new findings versus base (one S607 partial-path git call matching the file's existing idiom). - Real AppWorld end-to-end through the unified entry, from a fresh config written by following the README user path: `check` -> `run --smoke` (~16 min: cold start on 3 tasks, one full round with real diagnose/design, a real 1-line candidate commit, focused probe + confirm, promoted with an honest `credited=False` Gate-b verdict) -> termination. - Real `check` both ways: live subject endpoint -> `bench precheck: OK`; config pointed at a dead (NXDOMAIN) endpoint -> exit 1 at check time with an actionable `subject endpoint unreachable` message. - The bench placement (repo-root `benchmarks/`, outside the wheel, matching this directory's decoupling convention) was verified with a second real smoke: all three phases ran against a checkout of this layout, worktree evals resolved `python -m benchmarks.appworld.batch` from the checkout, and the designer wrote its candidate to the new whitelist path (`benchmarks/appworld/agent_cli.py`) as a real commit. ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes Security: this system has an LLM edit and execute code. Candidate edits are constrained to a per-bench path whitelist, an immutable kernel protects the measurement surface (the evolver itself and the scorer), and the README documents the threat model plus the recommendation to run evolutions in an isolated environment. Backward compatibility: purely additive -- new packages plus one optional `BenchBundle.precheck` field; nothing existing changes behavior. Rollback: revert the branch; no migrations, no config changes to existing features. ## Related Issues N/A --- Reviewer notes: - Exercised at smoke scale only: a full-size run (90 tasks x K=3, multi-round, hours) and the sealed-test unseal/retention path on a real benchmark are covered by tests but not yet by a production run; the README states this under "Status and known limitations". - One bench ships today (AppWorld, built-in scorer line); a framework-line example (external scorer) is planned as a follow-up. --------- Co-authored-by: Ethan Wang <ethan.wang@evermind.ai> Co-authored-by: Claude (claude-fable-5) <noreply@anthropic.com> Co-authored-by: Elliot Chen <2340896+cyfyifanchen@users.noreply.github.com>
…d-AI#157) ## Summary Profiling `raven tui` bring-up put the agent-loop build (`_build_tui_agent_loop`) at ~7s, so the TUI showed an empty shell for several seconds before real content (issue EverMind-AI#128 reports it as a 4-5s delay). Two eager imports on that path dominated: litellm when the loop built its provider, and the everos/lancedb memory backend (its `start()` measured ~2.5s). Deferring both off the render path drops the build to ~1.8s -- the diffuse-import residual -- and a startup loader fills what remains. - `perf`: `LazyProvider` defers litellm to the first chat (with a background prewarm); `EverosBackend` defers its adapter import into `start()`, which the TUI runs in the background after the render handshake. recall/store degrade to empty until the backend is ready. A cheap credential check keeps startup fail-fast without importing litellm. - `feat(tui)`: a `StartupLoader` (braille spinner in the SessionPanel box) fills the pre-handshake gap and is replaced by the real panel the moment `session.info` arrives. The empty-shell window drops from ~7s to ~1-2s, with real tool/skill counts and no `-32008` on the first send. Non-blocking trade-offs (documented, not bugs): the residual ~1.8s is diffuse imports with no single lever; quitting within the first ~2.5s waits briefly on the background backend task; a first message sent within ~2.5s runs one turn without memory recall (silent degrade). Phase-timing startup logs (one of the issue's acceptance items) were not added -- the delay was root-fixed rather than instrumented. Also reformats `useMainApp.ts` (a pre-existing drift from EverMind-AI#80) so the whole-tree prettier hook passes on this first ui-tui change since. ## Type - [x] Fix - [x] Feature ## Verification - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally Commands: `make lint-python`, `make test-python`, and `cd ui-tui && npm run lint && npm run type-check && npm test && npm run build`. ## Risk - [x] Backward compatibility considered Provider swap on model change still works (the loop holds a plain assignable provider attribute). agent/gateway paths keep `make_provider`; only the TUI uses the lazy path. ## Related Issues Fixes EverMind-AI#128 --------- Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary Bump Raven package metadata from 0.1.5 to 0.1.6 so the release tag can build a wheel from the current main branch. This release carries the changes merged after v0.1.5: - Version display now derives from installed package metadata (EverMind-AI#139). - Tracing dashboard port reuse avoids taking over non-Raven viewers (EverMind-AI#141). - CLI startup defers LiteLLM imports for faster cold start (EverMind-AI#147). - Self-evolution stack and AppWorld benchmark entry points are included (EverMind-AI#140). - TUI render delay is reduced by deferring provider and memory loading (EverMind-AI#157). ## Type - [ ] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [x] Other ## Verification - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [ ] User-facing docs or screenshots are updated when needed Commands run: - `PYTHONPATH=. uv run pytest tests/test_cli_smoke.py::test_version_flag_matches_installed_metadata -q` - `make check-commits COMMIT_RANGE=origin/main..HEAD` - `PYTHONPATH=. uv run python scripts/check_commit_file.py /tmp/raven-commit-msg.txt` No user-facing docs or screenshots were needed for this version metadata bump; release notes will be published with the GitHub Release. ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes This changes package metadata only. Rollback is to delete the v0.1.6 tag/release if publication fails before users upgrade, or publish a follow-up patch release if a released package issue is found. ## Related Issues N/A
## Summary Update the root README so the latest public surfaces are visible without changing the existing structure. The README now mentions: - Deep Research setup through `raven deep-research enable`. - The tracing dashboard through `raven tracing`. - The existing evolver pipeline in the architecture and status sections. - The related command and documentation entry points. ## Type - [ ] Fix - [ ] Feature - [x] Docs - [ ] CI / tooling - [ ] Refactor - [ ] Other ## Verification - [ ] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed Commands run: - `raven --help` - `raven deep-research --help` - `raven tracing --help` - `make check-large-files` - `make check-commits COMMIT_RANGE=origin/main..HEAD` - `git diff --check origin/main..HEAD -- README.md` No Python test suite was run because this is a README-only documentation change. ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes This is a documentation-only change and does not alter runtime behavior. ## Related Issues N/A
## Summary Update the Chinese README to match the recent English README feature coverage. The Chinese README now includes: - Deep Research in the opening positioning and update note. - Deep Research and tracing entries in the quick-start and command sections. - The Deep Research capability row in the comparison table. - Evolver and tracing references in the use-case, architecture, repo layout, docs, and status sections. ## Type - [ ] Fix - [ ] Feature - [x] Docs - [ ] CI / tooling - [ ] Refactor - [ ] Other ## Verification - [ ] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed Commands run: - `raven deep-research --help` - `raven tracing --help` - `make check-large-files` - `make check-commits COMMIT_RANGE=origin/main..HEAD` - `git diff --check origin/main..HEAD -- README.zh-CN.md` No Python test suite was run because this is a Chinese README-only documentation change. ## Risk - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes This is a documentation-only change and does not alter runtime behavior. ## Related Issues N/A
Member
This PR was auto-closed by a history rewrite, not by a maintainerOn 2026-09-12 the Your work is safe in your fork. Nothing in your repository was modified. To restore this PR, rebase onto the new git remote add upstream https://github.com/EverMind-AI/Raven.git # if you don't have it
git fetch upstream 'refs/tags/backup/pre-linearize-20260912:refs/tags/old-main'
git fetch upstream main
git rebase --onto upstream/main $(git merge-base <your-branch> old-main) <your-branch>
git push --force-with-leaseThen open a new PR and reference this one. Thank you for the contribution, and sorry for the disruption. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
retas a failed WeChat text send even whenerrcodeis zero.ret,errcode, and the server message in the raised error.{ret: -2, errcode: 0, errmsg: "prepare failed"}.Fixes #210
Why
_send_text()only checkederrcode. iLink can reject message preparation with a non-zeroretanderrcode=0, causing Raven callers to report a false successful delivery._poll_once()already treats either field as authoritative failure status.Verification
DID NOT RAISEbefore the implementation change.uv run pytest tests/test_channels_weixin.py::test_send_text_rejects_nonzero_ret_even_when_errcode_is_zero -q→ 1 passed.uv run pytest tests/test_channels_weixin.py tests/test_channels_manager.py tests/test_channels_outlet.py -q→ 71 passed.uv run ruff check raven/channels/adapters/weixin/channel.py tests/test_channels_weixin.py→ clean.uv run ruff format --check raven/channels/adapters/weixin/channel.py tests/test_channels_weixin.py→ clean.Risk
Low. The success path (
ret=0,errcode=0, or absent zero-default fields) is unchanged. The only behavior change is that a server-declared failure now propagates to the caller instead of being silently treated as success.Rollback
Revert commit
2d8cd2f; no data migration or configuration change is involved.Privacy
The issue and test use sanitized identifiers and content. No user tokens, chat IDs, local paths, or private messages are included.